package com.itheima.d1_exception;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

//目标：掌握异常的处理方式
public class Demo2 {
    //public static void main(String[] args) throws Exception{
    public static void main(String[] args) {
        /**
         * 异常的处理方式：
         * 1.抛出：
         *   方法声明处抛出：throws
         *   代码中抛出：throw
         *
         * 2.捕获：try...catch
         *
         * 异常处理的要求：
         *    底层方法的异常，使用throws往上一级方法抛出
         */

        //需求：针对本程序的异常，使用合理的方式进行处理

        //6.到了顶层逻辑，就不要继续往上抛了！
        //methodA();
        //如果在顶层，比如在main方法中继续抛出异常！谁去处理这些异常对象？虚拟机处理！
        //虚拟机处理异常的方案非常粗暴！虚拟机首先会在控制台展示异常信息，但是随之会将程序在出现异常的位置终止！
        //假设：未来我就输入一个日期字符串，如果输入错误出现异常，最终交给虚拟机处理，虚拟机终止程序，就是把系统关了

        //7.希望的处理方案：第一：还是要有相应的错误信息提醒，第二：不要终止程序，除非是非常严重的错误！

        //8.顶层异常使用 try...catch进行捕获
//        try {
//            methodA();
//        } catch (Exception e) {
//            //打印异常提示信息
//            e.printStackTrace();
//            //也可以自己写异常提醒
//            //System.err.println("代码出现问题！");
//        }

        methodA();
        System.out.println("后续代码");
    }

    //5.A也不是顶层方法，所以还是继续往上抛
    public static void methodA()  {
//        int num = 3 / 0;
        methodB();
    }

    //4.B方法中所有的异常，都可以用throws抛出
    //public static void methodB() throws ParseException, ArrayIndexOutOfBoundsException {
    public static void methodB() {
        //3.B方法还是底层方法！所以依然要继续往上一级抛出
        try {
            methodC();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("b");
//        throw new ArrayIndexOutOfBoundsException();
    }

    //2.使用throws在方法声明上，把方法中出现的异常对象继续往上一级抛出
    public static void methodC() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //1.C方法是底层方法，底层方法出现的异常往上抛！
        //已经出现代码提醒，说明底层计算机已经帮我们创建了对应的异常对象，然后底层自动用throw在代码中抛出了
        Date parse = sdf.parse("2020nian 05-20 13:14:20");
        // 上面代码的底层：throw new ParseException();
        System.out.println("c");
    }
}